<?php
/*
* Page操作类
* 可选择是否使用内置样式
* Example：
* $perpage = 5;
* $goods_count = $pdo->query("SELECT COUNT(1) AS count FROM tbl_goods")->fetchColumn();
* $page = new Page(array('total' => $goods_count, 'perpage' => $perpage));
* $page->next_page   = '下一页';
* $page->pre_page    = '上一页';
* echo $page->show(4, "yahoo")；
*/
class Page
{
	var $page_name      = "p";     //page标签，用来控制url页。比如说xxx.php?PB_page=2中的PB_page
	var $rewrite        = false;   //rewrite开关
	var $rewrite_suffix = 'html';  //rewrite文件名后缀
	var $next_page      = '>';     //下一页
	var $pre_page       = '<';     //上一页
	var $first_page     = 'First'; //首页
	var $last_page      = 'Last';  //尾页
	var $pre_bar        = '<<';    //上一分页条
	var $next_bar       = '>>';    //下一分页条
	var $format_left    = '';
	var $format_right   = '';
	var $is_ajax        = false;   //是否支持AJAX分页模式
	var $style_path     = "style"; //分页样式访问路径

	/** 内置变量 **/
	var $pagebarnum       = 10; //控制记录条的个数。
	var $totalpage        = 0;  //总页数
	var $ajax_action_name = ''; //AJAX动作名
	var $nowindex         = 1;  //当前页
	var $url              = ""; //url地址头
	var $offset           = 0;

	/** 构造函数 **/
	function page($array)
	{
		if (is_array($array)){
			if(!array_key_exists('total', $array)) $this->error(__FUNCTION__, 'need a param of total');
			$total = intval($array['total']);
			$perpage = (array_key_exists('perpage', $array)) ? intval($array['perpage']) : 10;
			$nowindex = (array_key_exists('nowindex',$array)) ? intval($array['nowindex']):'';
			$url = (array_key_exists('url', $array)) ? $array['url'] : '';
		} else {
			$total    = $array;
			$perpage  = 10;
			$nowindex = '';
			$url      = '';
		}
		if ((!is_int($total)) || ($total < 0)) $this->error(__FUNCTION__, $total.' is not a positive integer!');
		if ((!is_int($perpage)) || ($perpage <= 0)) $this->error(__FUNCTION__, $perpage.' is not a positive integer!');
		if (!empty($array['page_name'])) $this->set('page_name', $array['page_name']); //设置pagename
		$this->_set_nowindex($nowindex); //设置当前页
		$this->_set_url($url); //设置链接地址
		$this->totalpage = ceil($total / $perpage);
		$this->offset = ($this->nowindex-1) * $perpage;
		if (!empty($array['ajax'])) $this->open_ajax($array['ajax']); //打开AJAX模式
	}

	/** 设定类中指定变量名的值，如果改变量不属于这个类，将throw一个exception **/
	function set($var, $value)
	{
		if(in_array($var, get_object_vars($this)))
		$this->$var = $value;
		else {
			$this->error(__FUNCTION__, $var." does not belong to PB_Page!");
		}

	}

	/** 打开倒AJAX模式 **/
	function open_ajax($action)
	{
		$this->is_ajax = true;
		$this->ajax_action_name = $action;
	}

	/** 获取显示"下一页"的代码 **/
	function next_page($style='')
	{
		if($this->nowindex < $this->totalpage){
			return $this->_get_link($this->_get_url($this->nowindex + 1), $this->next_page, $style);
		}
		return '<span class="'.$style.'">'.$this->next_page.'</span>';
	}

	/** 获取显示“上一页”的代码 **/
	function pre_page($style = '')
	{
		if($this->nowindex > 1){
			return $this->_get_link($this->_get_url($this->nowindex - 1), $this->pre_page, $style);
		}
		return '<span class="'.$style.'">'.$this->pre_page.'</span>';
	}

	/** 获取显示“首页”的代码 **/
	function first_page($style = '')
	{
		if($this->nowindex == 1){
			return '<span class="'.$style.'">'.$this->first_page.'</span>';
		}
		return $this->_get_link($this->_get_url(1), $this->first_page, $style);
	}

	/** 获取显示“尾页”的代码 **/
	function last_page($style = '')
	{
		if($this->nowindex == $this->totalpage){
			return '<span class="'.$style.'">'.$this->last_page.'</span>';
		}
		return $this->_get_link($this->_get_url($this->totalpage) ,$this->last_page, $style);
	}

	function nowbar($style = '', $nowindex_style = '')
	{
		$plus = ceil($this->pagebarnum / 2);
		if($this->pagebarnum - $plus + $this->nowindex > $this->totalpage)$plus = ($this->pagebarnum - $this->totalpage + $this->nowindex);
		$begin  = $this->nowindex - $plus + 1;
		$begin  = ($begin >= 1) ? $begin : 1;
		$return = '';
		for($i = $begin; $i < $begin + $this->pagebarnum; $i++)
		{
			if($i <= $this->totalpage){
				if($i != $this->nowindex)
				$return .= $this->_get_text($this->_get_link($this->_get_url($i), $i, $style));
				else
				$return .= $this->_get_text('<span class="'.$nowindex_style.'">'.$i.'</span>');
			}else{
				break;
			}
			$return .= "\n";
		}
		unset($begin);
		return $return;
	}

	/** 获取显示跳转按钮的代码 **/
	function select($url)
	{
		$return = '<select name="PB_Page_Select"   >';
		for($i = 1; $i <= $this->totalpage; $i++)
		{
			if($i == $this->nowindex){
				$return .= '<option value='.$url.$i.' selected>'.$i.'</option>';
			}else{
				$return .= '<option value='.$url.$i.'>'.$i.'</option>';
			}
		}
		unset($i);
		$return .= '</select>';
		return $return;
	}

	/**  获取mysql 语句中limit需要的值 **/
	function offset()
	{
		return $this->offset;
	}

	/** 控制分页显示风格（你可以增加相应的风格） **/
	function show($mode = 1, $style = '', $url = '' )
	{
		if (!empty($style)) {
			$put = '<link rel="stylesheet" type="text/css" href="'.$this->style_path.'/'.$style.'.css" media="all" />';
			$put .= "<div id='ligu_page' class='".$style."'>";
		} else {
			$put = "<div id='ligu_page'>";
		}
		switch ($mode)
		{
			case '1':
				$put .= $this->pre_page("disabled").$this->nowbar("", "current").$this->next_page("disabled").' 第'.$this->select($url).'页';
				break;
			case '2':
				$put .= $this->first_page("disabled").$this->pre_page("disabled").'[第'.$this->nowindex.'页]'.$this->next_page("disabled").$this->last_page("disabled").'第'.$this->select($url).'页';
				break;
			case '3':
				$put .= $this->first_page("disabled").$this->pre_page("disabled").$this->next_page("disabled").$this->last_page("disabled");
				break;
			case '4':
				$put .= $this->pre_page("disabled").$this->nowbar("", "current").$this->next_page("disabled")."</div>";
				break;
			case '5':
				$put .= $this->pre_bar.$this->pre_page("disabled").$this->nowbar("", "current").$this->next_page("disabled").$this->next_bar;
				break;
		}
		if (!empty($tyle)) {
			$put .= "</div>";
		}
		return $put;

	}
	/*----------------private function (私有方法)-----------------------------------------------------------*/
	/** 设置url头地址 **/
	function _set_url($url = "")
	{
		if(!empty($url)){
			// 手动设置
			$this->url = $url.((stristr($url, '?')) ? '&' : '?').$this->page_name."=";
		}else{
			// 自动获取
			if(empty($_SERVER['QUERY_STRING'])){
				// 不存在QUERY_STRING时
				$this->url = $_SERVER['REQUEST_URI']."?".$this->page_name."=";
			}else{
				//
				if(stristr($_SERVER['QUERY_STRING'], $this->page_name.'=')){
					// 地址存在页面参数
					$this->url = str_replace($this->page_name.'='.$this->nowindex, '', $_SERVER['REQUEST_URI']);
					$last = $this->url[strlen($this->url) - 1];
					if($last == '?' || $last == '&'){
						$this->url .= $this->page_name."=";
					}else{
						$this->url .= '&'.$this->page_name."=";
					}
				}else{
					//
					$this->url = $_SERVER['REQUEST_URI'].'&'.$this->page_name.'=';
				} //end if
			} //end if
		} //end if
	}

	/** 设置当前页面 **/
	function _set_nowindex($nowindex)
	{
		if(empty($nowindex)){
			// 系统获取
			if(isset($_GET[$this->page_name])){
				$this->nowindex = intval($_GET[$this->page_name]);
			}
		}else{
			// 手动设置
			$this->nowindex = intval($nowindex);
		}
	}

	/** 为指定的页面返回地址值 **/
	function _get_url($pageno = 1)
	{
		if ($this->rewrite == true) {
			//$tmp = str_replace(".".$this->rewrite_suffix, "", $this->url);
			preg_match("/([a-z]+)\-([0-9]+)\-([0-9]+)\.".$this->rewrite_suffix."/", $this->url, $tmp);
			return $tmp[1]."-".$tmp[2]."-".$pageno.".".$this->rewrite_suffix;
		}else{
			return $this->url.$pageno;
		}
	}

	/**  获取分页显示文字，比如说默认情况下_get_text('<a href="">1</a>')将返回[<a href="">1</a>] **/
	function _get_text($str)
	{
		return $this->format_left.$str.$this->format_right;
	}

	/** 获取链接地址 **/
	function _get_link($url, $text, $style = ''){
		$style = (empty($style))?'':'class="'.$style.'"';
		if($this->is_ajax){
			// 如果是使用AJAX模式
			return '<a '.$style.' href="javascript:'.$this->ajax_action_name.'(\''.$url.'\')">'.$text.'</a>';
		}else{
			return '<a '.$style.' href="'.$url.'">'.$text.'</a>';
		}
	}

	/** 出错处理方式 **/
	function error($function, $errormsg)
	{
		die('Error in file <b>'.__FILE__.'</b> ,Function <b>'.$function.'()</b> :'.$errormsg);
	}
}
?>